﻿using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Yz.Base;

namespace Yz.Cache
{
    public interface ICacheUitility
    {

        #region 从缓存中获取数据（有委托）

        #region 没有参数 
        #endregion

        #region 1个参数 
        #endregion

        #region 2个参数 
        /// <summary>
        /// 从缓存中获取数据或更新缓存 
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="func">委托方法</param>
        /// <param name="args">至少有2个参数（从右往左（从后往前），1：是否去更新缓存，2：CacheDbTime 对象（包含时间和数据库索引） </param>
        /// <returns>List<T></returns>
        T GetFromCache<TEntity, T>(Func<Expression<Func<TEntity, bool>>, List<ParaOrder<TEntity>>, T> func, params object[] args) where TEntity : BaseEntity where T : ViewModel;
        /// <summary>
        /// 从缓存中获取数据或更新缓存 
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="func">委托方法</param>
        /// <param name="args">至少有2个参数（从右往左（从后往前），1：是否去更新缓存，2：CacheDbTime 对象（包含时间和数据库索引） </param>
        /// <returns>List<T></returns>
        Task<T> GetFromCacheAsync<TEntity, T>(Func<Expression<Func<TEntity, bool>>, List<ParaOrder<TEntity>>, Task<T>> func, params object[] args) where TEntity : BaseEntity where T : ViewModel;
        #endregion

        #region 3个参数

        #endregion

        #region 4个参数 
        ReturnList<T> GetListFromCache<TEntity, T>(Func<Expression<Func<TEntity, bool>>, ParaPage, List<ParaOrder<TEntity>>, bool, ReturnList<T>> Func, params object[] args) where TEntity : BaseEntity where T : ViewModel;
        /// <summary>
        /// 从缓存中获取数据或更新缓存（string,int,int）
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="Func">委托方法</param>
        /// <param name="args">至少有2个参数（从右往左（从后往前），1：是否去更新缓存，2：CacheDbTime 对象（包含时间和数据库索引）</param>
        /// <returns>List<T></returns>
        Task<ReturnList<T>> GetListFromCacheAsync<TEntity, T>(Func<Expression<Func<TEntity, bool>>, ParaPage, List<ParaOrder<TEntity>>, bool, Task<ReturnList<T>>> Func, params object[] args) where TEntity : BaseEntity where T : ViewModel;
        #endregion

        #region 5个参数

        ReturnList<T> GetListFromCache<TEntity, T>(Func<List<Expression<Func<TEntity, bool>>>, ParaPage, List<ParaOrder<TEntity>>, bool, bool, ReturnList<T>> Func, params object[] args) where TEntity : BaseEntity where T : ViewModel;

        /// <summary>
        /// 从缓存中获取数据或更新缓存（string,int,int）
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="Func">委托方法</param>
        /// <param name="args">至少有2个参数（从右往左（从后往前），1：是否去更新缓存，2：CacheDbTime 对象（包含时间和数据库索引）</param>
        /// <returns>List<T></returns>
        Task<ReturnList<T>> GetListFromCacheAsync<TEntity, T>(Func<List<Expression<Func<TEntity, bool>>>, ParaPage, List<ParaOrder<TEntity>>, bool, bool, Task<ReturnList<T>>> Func, params object[] args) where TEntity : BaseEntity where T : ViewModel;


        #endregion

        #region 6个参数
        #endregion

        #region 7个参数
        #endregion

        #region 8个参数
        #endregion

        #endregion

        #region 查询缓存
        T GetCache<T>(BaseParaCache cachePara);
        string GetCache(BaseParaCache cachePara);
        Task<T> GetCacheAsync<T>(BaseParaCache cachePara);
        Task<string> GetCacheAsync(BaseParaCache cachePara);
        #endregion

        #region 设置缓存
        bool SetCache<T>(ParaCache cachePara, T value);
        Task<bool> SetCacheAsync<T>(ParaCache cachePara, T value);
        #endregion

        #region 清空缓存

        bool DeleteCache(string cacheKey, int dbNum = 0);
        Task<bool> DeleteCacheAsync(string cacheKey, int dbNum = 0);
        #endregion
    }
}